package priv.pfz.basedao.jdbctemplate.dao;

import priv.pfz.basedao.pagequery.Page;
import priv.pfz.basedao.query.BaseQuery;
import priv.pfz.basedao.sharding.ShardingInfo;

import javax.annotation.Nonnull;
import java.util.List;

/**
 * @author yyjxp
 * 2024/8/4 19:38
 */
public interface DefaultShardingBaseDao<Entity, Query extends BaseQuery<Query>> extends SimpleShardingBaseDao<Entity> {
    /**
     * 按query条件批量更新多条记录
     * entity中为空的字段不会更新
     * UPDATE table SET a=entity.a, b=entity.b WHERE query
     */
    int update(@Nonnull Entity entity, @Nonnull Query query, ShardingInfo shardingInfo);

    /**
     * 按query条件查询数量
     * query中为空的字段不会作为查询条件
     * SELECT count(*) FROM table WHERE query
     */
    int count(@Nonnull Query query, ShardingInfo shardingInfo);

    /**
     * 按query条件查询多条记录
     * query中为空的字段不会作为查询条件
     * SELECT a,b,c FROM table WHERE/ORDER_BY/LIMIT query
     */
    List<Entity> list(@Nonnull Query query, ShardingInfo shardingInfo);

    /**
     * 按query中的条件删除多条记录
     * query中为空的字段不会作为删除条件
     * DELETE FROM table WHERE query
     */
    int delete(@Nonnull Query query, ShardingInfo shardingInfo);

    /**
     * 分页查询，先调用count再调用list方法
     */
    Page<Entity> pageQuery(@Nonnull Query query, ShardingInfo shardingInfo);
}
